package interfaz;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Toolkit;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Observer;
import java.util.Properties;

import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JTabbedPane;
import javax.swing.JTextField;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

import mundo.P2P;

public class InterfazP2P extends JFrame 
{
	private PanelAplicacionesRemotas par;
	private PanelMisAplicaciones pma;
	private PanelConfiguracion pc;
	
	private boolean mostrarResPopup;
	
	private P2P p2p;
	
	public InterfazP2P( )
	{
		try {
		      UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
		    } catch (Exception e) {
		      //e.printStackTrace();
		    }
		
		try {
			Properties p = cargarConfig( );
			
			String ip = p.getProperty( "ip" );
	        String puerto = p.getProperty( "puerto" );
	        
	        try 
	        {
				p2p = new P2P( Integer.parseInt( puerto ), ip );
			} 
	        catch (Exception e) 
	        {
				JOptionPane.showMessageDialog( this, e.getMessage() );
			}
			pc = new PanelConfiguracion( this, ip, puerto );
		} 
		catch (Exception e) 
		{
			JOptionPane.showMessageDialog( this, e.getMessage() );
			try 
			{
				p2p = new P2P( 27015, "239.1.1.1" );
				pc = new PanelConfiguracion( this, "239.1.1.1", "27015" );
			} 
			catch (Exception f) 
			{
				JOptionPane.showMessageDialog( this, f.getMessage() );
			}
		}
		setLayout( new BorderLayout( ) );
		
		JLabel lbl = new JLabel( );
		lbl.setIcon( new ImageIcon( "./data/header.png" ));
		add( lbl, BorderLayout.NORTH );
		
		par = new PanelAplicacionesRemotas( this );
		pma = new PanelMisAplicaciones( this );
		p2p.addObserver( pma );
		p2p.addObserver( par );
		
		mostrarResPopup = true;
		
		setLocation( (int)Toolkit.getDefaultToolkit().getScreenSize().getWidth()/2 -300, (int)Toolkit.getDefaultToolkit().getScreenSize().getHeight()/2 -200 );
		setResizable( false );
		setTitle( "P2P Aplication Sharing Network" );
		setSize( new Dimension( 600, 400 ));
		setVisible( true );
		setDefaultCloseOperation( JFrame.DISPOSE_ON_CLOSE );
		
		
		JTabbedPane tabbedPane = new JTabbedPane();
		tabbedPane.addTab( "Aplicaciones Remotas", par );
		tabbedPane.addTab( "Mis Aplicaciones", pma );
		tabbedPane.addTab( "Configuracion", pc );
		add( tabbedPane, BorderLayout.CENTER );
	}

	/**
	 * @param args
	 */
	public static void main(String[] args) 
	{
		new InterfazP2P( );
	}

	public void mostrarDialogoAgregarAplicacion() 
	{
		DialogoAgregarAplicacion dia = new DialogoAgregarAplicacion( this );
		dia.setVisible( true );
	}
	
	public void agregarAplicacion( DialogoAgregarAplicacion dia, String nombre, String nombreClase, String puerto )
	{
		dia.setVisible( false );
		try {
			p2p.agregarAplicacion( nombre, nombreClase, Integer.parseInt( puerto ) );
			dia.dispose();
		} catch (NumberFormatException e) {
			JOptionPane.showMessageDialog( this, "El puerto no es un numero" );
			dia.setVisible( true );
		} catch (Exception e) {
			JOptionPane.showMessageDialog( this, e.getMessage() );
			e.printStackTrace();
			dia.setVisible( true );
		}
	}
	
	private Properties cargarConfig( ) throws Exception, IOException
	{
		Properties properties = new Properties();
	    properties.load(new FileInputStream("./data/config.properties"));
	    return properties;
	}

	public void guardarConfig( String ip, String puerto ) 
	{
		try {
			PrintWriter out = new PrintWriter( new File( "./data/config.properties" ) );
			out.println( "ip = " + ip );
			out.println( "puerto = " + puerto );
			out.close();
			JOptionPane.showMessageDialog( this, "Configuracion guardada exitosamente. Reinicie el programa." );
		} catch (FileNotFoundException e) {
			JOptionPane.showMessageDialog( this, "No se pudo guardar la configuracion" );
		}
	}

	public void eliminarAplicacion( String nombre) 
	{
		int res = JOptionPane.showConfirmDialog( this, "Seguro que desea eliminar " + nombre + "?" );
		if( res == JOptionPane.YES_OPTION )
			try {
				p2p.borrarAplicacion( nombre );
			} catch (IOException e) {
				JOptionPane.showMessageDialog( this, e.getMessage() );
			}
	}

	public void mostrarDialogoUsarAplicacion( String nombre, String params ) 
	{
		DialogoUsarAplicacion dia = new DialogoUsarAplicacion( this, nombre, params.split(",") );
		dia.setVisible( true );
	}

	public void usarAplicacion( DialogoUsarAplicacion d, String nombre, String[] params ) 
	{
		d.setVisible( false );
		DialogoMostrarResultados dia = new DialogoMostrarResultados( );
		p2p.usarAplicacion( dia, nombre, params );
		if( mostrarResPopup )
		{
			int answer = JOptionPane.showConfirmDialog( this, "Usando aplicacion. Un dialogo nuevo se abrira cuando se reciba el resultado.\nDesea omitir esta advertencia?" );
			if( answer == JOptionPane.YES_OPTION )
				mostrarResPopup = false;
		}
		d.dispose();
	}
	
	public void dispose( )
	{
		p2p.borrarTodasLasAplicaciones();
		super.dispose();
	}

}
